package org.jwt.oauth.tools;

import org.jwt.oauth.tools.JsonTool;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class FusionJwtTools {

	public static Map<String, Object> getLoginUserInfo(String value) {
		List<String> arrayList = new ArrayList<>();
		arrayList.add("scope");
		arrayList.add("exp");
		arrayList.add("jti");
		arrayList.add("client_id");
		arrayList.add("user_name");
		arrayList.add("ati");
		Map<String, Object> hashMap = new HashMap<String, Object>();
		String tokenValue = null;
		if (value != null && value.trim().length() > 0) {
			tokenValue = value;
		} else {
			tokenValue = FusionTokenTools.getTokenValue();
		}
		if (tokenValue != null && tokenValue.length() > 0 && !tokenValue.equalsIgnoreCase("null")) {
			Jwt decode = JwtHelper.decode(tokenValue);
			String claims = decode.getClaims();
			Map<?, ?> jsonToMap = JsonTool.JsonToMap(claims);
			if (jsonToMap != null && jsonToMap.size() > 0) {
				for (Map.Entry<?, ?> entry : jsonToMap.entrySet()) {
					String keyMap = String.valueOf(entry.getKey());
					if (!arrayList.contains(keyMap)) {
						hashMap.put(String.valueOf(entry.getKey()), entry.getValue());
					}
				}
			}
		}
		return hashMap;
	}

	public static Map<String, Object> getLoginUserInfo() {
		return getLoginUserInfo(null);
	}

	public static <T> T getLoginInfo(Class<T> clazz, String value) {
		Map<String, Object> dataMap = getLoginUserInfo(value);
		if (dataMap != null && dataMap.size() > 0) {
			String objectToJson = JsonTool.ObjectToJson(dataMap);
			return JsonTool.jsonToClass(objectToJson, clazz);
		}
		return null;
	}

	public static <T> T getLoginInfo(Class<T> clazz) {
		Map<String, Object> dataMap = getLoginUserInfo();
		if (dataMap != null && dataMap.size() > 0) {
			String objectToJson = JsonTool.ObjectToJson(dataMap);
			return JsonTool.jsonToClass(objectToJson, clazz);
		}
		return null;
	}

}